Concurrency এবং Asynchronous Sockets হল নেটওয়ার্ক প্রোগ্রামিংয়ের গুরুত্বপূর্ণ ধারণা যা একাধিক টাস্ক একযোগে পরিচালনা করার জন্য ব্যবহৃত হয়। এই ধারণাগুলি সিস্টেমের কার্যকারিতা বৃদ্ধি করতে সহায়ক, বিশেষ করে যখন একাধিক ক্লায়েন্ট বা নেটওয়ার্কের মধ্যে চলমান অনেক কাজ পরিচালনা করতে হয়।
এখানে, Concurrency এবং Asynchronous Sockets এর মধ্যে পার্থক্য এবং Python এ তাদের প্রয়োগের উদাহরণ দেয়া হবে।
Concurrency হল একাধিক কাজ একই সময়ে সম্পাদিত হওয়ার সম্ভাবনা, কিন্তু তাদের সমাপ্তি একে অপরের সাথে ওভারল্যাপ করতে পারে। Concurrency একাধিক কাজ বা থ্রেডের মধ্যে প্রসেসগুলিকে পরিচালনা করতে সাহায্য করে, যদিও একাধিক কাজ একযোগে সম্পাদন নাও হতে পারে। উদাহরণস্বরূপ, একটি সার্ভার যখন একাধিক ক্লায়েন্টের সাথে যোগাযোগ স্থাপন করে, তখন এটি একযোগে তাদের থেকে ডেটা গ্রহণ বা পাঠাতে সক্ষম হয়।
import socket
import threading
def handle_client(client_socket):
request = client_socket.recv(1024)
print(f"Received: {request.decode()}")
client_socket.send(b"Hello Client")
client_socket.close()
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 65432))
server.listen(5)
print("Server listening on port 65432")
while True:
client_socket, client_address = server.accept()
print(f"Connection from {client_address}")
client_handler = threading.Thread(target=handle_client, args=(client_socket,))
client_handler.start()
start_server()
এখানে, প্রতিটি ক্লায়েন্টের জন্য একটি নতুন থ্রেড তৈরি করা হচ্ছে, যাতে সার্ভার একাধিক ক্লায়েন্টের সাথে সমান্তরালভাবে যোগাযোগ স্থাপন করতে পারে। এর মাধ্যমে প্রতিটি ক্লায়েন্টের জন্য আলাদা ট্রেডিং করা হয়, যা সার্ভারকে একাধিক ক্লায়েন্টের সাথে যোগাযোগ করতে সক্ষম করে।
Asynchronous Sockets এমন এক ধরনের সকেট প্রোগ্রামিং যেখানে একটি থ্রেড ব্লক না হয়ে ব্যাকগ্রাউন্ডে কাজ করতে থাকে। এর মাধ্যমে, নেটওয়ার্কের মধ্যে ডেটা পাঠানোর জন্য অপেক্ষা করার সময় অন্য কাজ করা যায়। Asynchronous programming সাধারণত callback functions বা event-driven programming ব্যবহার করে কাজ করে।
Python এর asyncio লাইব্রেরি দিয়ে সহজেই Asynchronous সোসকেট প্রোগ্রাম তৈরি করা যায়।
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message} from {addr}")
response = f"Hello, {message}"
writer.write(response.encode())
await writer.drain()
print("Closing the connection")
writer.close()
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 65432)
addr = server.sockets[0].getsockname()
print(f"Serving on {addr}")
async with server:
await server.serve_forever()
asyncio.run(main())
এখানে asyncio ব্যবহার করা হয়েছে যা আসিঙ্ক্রোনাস সার্ভার তৈরি করতে সাহায্য করে। যখন ক্লায়েন্ট সংযোগ করে, তখন handle_client()
ফাংশন আসিঙ্ক্রোনাসভাবে কাজ করে এবং সেই সময় অন্য ক্লায়েন্টদের জন্য সার্ভারটি কার্যকরী থাকে।
async def
: অ্যাসিঙ্ক্রোনাস ফাংশন তৈরি করে।await
: ইভেন্টের শেষ হওয়া পর্যন্ত অপেক্ষা করে, তবে পুরো থ্রেড ব্লক না হয়।asyncio.start_server()
: সার্ভার শুরু করে এবং আসিঙ্ক্রোনাসভাবে ক্লায়েন্টদের সাথে কাজ করতে পারে।একটি ওয়েব সার্ভারে Concurrency এবং Asynchronous Programming এর একত্রিত ব্যবহার হতে পারে যেখানে সার্ভারটি একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ করে এবং সেগুলির প্রতিক্রিয়া দ্রুত সরবরাহ করে।
import asyncio
import threading
# আসিঙ্ক্রোনাস হ্যান্ডলার
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message} from {addr}")
response = f"Hello, {message}"
writer.write(response.encode())
await writer.drain()
print("Closing the connection")
writer.close()
# থ্রেডেড অ্যাসিঙ্ক্রোনাস সার্ভার
def run_server():
asyncio.run(main())
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 65432)
addr = server.sockets[0].getsockname()
print(f"Serving on {addr}")
async with server:
await server.serve_forever()
# সার্ভার থ্রেড তৈরি করা
server_thread = threading.Thread(target=run_server)
server_thread.start()
এখানে, একটি থ্রেড তৈরি করা হয়েছে যা আসিঙ্ক্রোনাস সার্ভার চালায়। এর ফলে সার্ভারটি একাধিক ক্লায়েন্টকে সঠিকভাবে পরিচালনা করতে পারে এবং প্রতিটি ক্লায়েন্টের জন্য অপেক্ষা করার পরিবর্তে ব্যাকগ্রাউন্ডে কাজ করতে থাকে।
এভাবে, Concurrency এবং Asynchronous Programming এর সমন্বয় করা গেলে নেটওয়ার্ক সার্ভার এবং অ্যাপ্লিকেশনগুলি আরও দক্ষ এবং স্কেলেবল হতে পারে।
common.read_more